package com.project.springboot.config;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.*;

/**
 * Description：数据源配置类
 * Created by 朱正磊 on 2019-03-11 23:48
 */
@SpringBootConfiguration
public class DBConfiguration {

//    @Resource
//    private Environment env;
//
//    @Bean
//    public DataSource dataSource() {
//        DruidDataSource dataSource = new DruidDataSource();
//        dataSource.setDriverClassName(env.getProperty("spring.datasource.dynamic.datasource.first.driver-class-name"));
//        dataSource.setUrl(env.getProperty("spring.datasource.dynamic.datasource.first.url"));
//        dataSource.setUsername(env.getProperty("spring.datasource.dynamic.datasource.first.username"));
//        dataSource.setPassword(env.getProperty("spring.datasource.dynamic.datasource.first.password"));
//
//        // testOnBorrow：如果为true（默认false），当应用向连接池申请连接时，连接池会判断这条连接是否是可用的。
//        dataSource.setTestOnBorrow(false);
//        // 如果为true（默认true），当应用向连接池申请连接，并且testOnBorrow为false时，
//        // 连接池将会判断连接是否处于空闲状态，如果是，则验证这条连接是否可用。
//        // testOnBorrow能够确保我们每次都能获取到可用的连接，但如果设置成true，
//        // 则每次获取连接的时候都要到数据库验证连接有效性，这在高并发的时候会造成性能下降，
//        // 可以将testOnBorrow设成false，testWhileIdle设置成true这样能获得比较好的性能。
//        dataSource.setTestWhileIdle(true);
//        // 用来检测连接是否有效的sql，要求是一个查询语句。
//        // 如果validationQuery为null，testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
//        dataSource.setValidationQuery("SELECT 1");
//        // 初始化时建立物理连接的个数，初始化发生在显示调用init方法或者第一次getConnection时
//        dataSource.setInitialSize(10);
//        // 最小连接池数量
//        dataSource.setMinIdle(10);
//        // 最大连接池数量
//        dataSource.setMaxActive(100);
//        // 获取连接时最大等待时间，单位是毫秒。
//        // 配置了maxWait之后，缺省使用公平锁，并发效率会有所下降，
//        // 如果需要可以通过配置useUnfairLock属性为true使用非公平锁
//        dataSource.setMaxWait(20000);
//
//
//        List<Filter> filters = new ArrayList<>();
//        // 对druid的wall过滤器进行配置，允许SQL语句中存在注释
//        WallFilter wallFilter = new WallFilter();
//        WallConfig wallConfig = new WallConfig();
//        wallConfig.setCommentAllow(true);
//        wallFilter.setConfig(wallConfig);
//        filters.add(wallFilter);
//        dataSource.setProxyFilters(filters);
//
//        return dataSource;
//    }
//
//    /**
//     * description: 配置Druid监控
//     * @author 朱正磊
//     * @date 2023-06-17 17:58:37
//     */
//    @Bean
//    public ServletRegistrationBean<StatViewServlet> statViewServlet(){
//        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>();
//        bean.setServlet(new StatViewServlet());
//        bean.addUrlMappings("/druid/*");
//        Map<String, String> initParams = new HashMap<>();
//        // 禁用HTML页面上的Rest All功能
//        initParams.put("resetEnable", "false");
//        // 监控页面登录用户名
//        initParams.put("loginUsername", "admin");
//        // 监控页面登录用户密码
//        initParams.put("loginPassword", "admin.123");
//        // ip白名单，默认仅仅只允许本地访问，若需要配置多个则以,进行分隔
//        initParams.put("allow", "127.0.0.1");
//        // ip黑名单，若同时存在，deny优先于allow
//        initParams.put("deny", "");
//        bean.setInitParameters(initParams);
//        // 禁用监控页面
//        // bean.setEnabled(false);
//        return bean;
//    }
//
//    /**
//     * description: 配置一个web监控的filter
//     * @author 朱正磊
//     * @date 2023-06-17 17:58:47
//     */
//    @Bean
//    public FilterRegistrationBean<WebStatFilter> webStatFilter(){
//        FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>();
//        bean.setFilter(new WebStatFilter());
//        Map<String,String> initParams = new HashMap<>();
//        initParams.put("exclusions", "*.js,*.css,/druid/*");
//        bean.setInitParameters(initParams);
//        bean.setUrlPatterns(Collections.singletonList("/*"));
//        return bean;
//    }

}
